package JavaEE.ManyThread6;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/*
* 生产者,消费者模型(擀皮 and 包饺子)
* 好处:
* 1. 减少关键资源的竞争,提高效率
* 原理: 无生产者的话,所有厨师"既要包饺子,又要擀皮",则会导致"所有厨师竞争擀面杖,面粉等资源",
*      频繁切换工具导致效率低下,资源竞争激烈,大量时间等待
* 2. 降低耦合(如果一个模块出现问题,减少相关模块的损坏程度)
* 原理: 擀皮工不需要知道怎么包饺子,包饺工不需要知道皮怎么擀.
*      如果擀皮工艺改进,只需要修改生产者代码,如果包饺子改进,只需要修改包饺子代码
* 3. 削峰填谷
* 坏处:
* 1. 系统更复杂,维护成本更高
* 2. 增加网络通信的开销
 */
public class Demo2 {
    public static void main(String[] args) throws InterruptedException{
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(100);
        Random random = new Random();
        // 生产者模型
        Thread producer = new Thread(() -> {
            int count = 1;
            try{
                while(true) {
                    queue.add(count);
                    System.out.println("我生产了一个数字: " + count);
                    count++;
                    Thread.sleep(1000);
                }
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        });
        // 消费者模型
        Thread consumer = new Thread(() -> {
            try{
                while(true){
                    System.out.println("我消耗了一个数字: " + queue.take());
                    Thread.sleep(random.nextInt(3000));
                }
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        });
        producer.start();
        consumer.start();
        producer.join();
        consumer.join();
    }
}
